The video below shows setting up a system integration process to import profile (ie customer) data from a remote source.

This process matched existing customers where possible, and when new information allows existing profiles to be identified as duplicates merges them.

This is just a simple introduction, the matching API offers many more factors for matching profiles.

 

 


 

Source code used in the demo

controllers.xml

<integration>
    <!-- Carters To EMC -->
    <endpoint
        id='IMPORT-CUSTS'
        type='sftp-fetching'
        execIdTemplate="IMPORT-CUSTS"
        address="sftp://10.10.10.10:222/upload"
        fileName="@{formatter.formatJodaDate(formatter.addDays(formatter.now, -1), 'ddMMyyyy', pipeline.org().timezone)}.emc"
        username="XXX"
        password="XXX"
        pipelinePath='/integration/import-custs.xml'
        storeFile='true'
        direction='in'
        enabled='true'
    />

</integration>   

 

import-custs.xml

<TransactionStep>
    <next class="CsvInput" separator="," startRow="1">
        <next class="JsRowStep">
            <jsPath>/integration/check-custs.js</jsPath>
            <execFn>checkCusts</execFn>

            <next class="DatabaseUpdateStep" providerId="profile" mode="updateOrInsert">
                <column field="firstName" columnName="A"/>
                <column field="surName" columnName="B"/>
                <column field="phone" columnName="C"/>
                <column field="email" columnName="D"/>
                <column field="userId" columnName="E"/> <!-- Injected by JS based on matching logic -->
                <column field="group" valueString="customers"/>
            </next>

        </next>
    </next>
</TransactionStep>

 

check-custs.js


function checkCusts(firstName, surName, phone, email) {   
    var matchReq = userManager.newProfileMatchRequest().or();
    // this will return all profiles matching all given non-blank params
    
    if( email ) {
        matchReq.newSubCriteria().and()
            .firstName(firstName)
            .email(email);    
    }
    
    if( phone ) {
        matchReq.newSubCriteria().and()
            .firstName(firstName)
            .phone(phone);
    }
    
    var matched = userManager.findMatching(matchReq);
    log.info("Matched {} profiles", matched.size());
    if( matched.size() == 0 ) {
        nextStep.exec(firstName, surName, phone, email, null);
    } else if( matched.size() == 1) {
        var existing = matched.get(0);
        nextStep.exec(firstName, surName, phone, email, existing.userName);
    } else {
        // Choose the first as the merge target. Merge others into that, and then continue with it
        var mergeDest = matched.get(0);
        matched.remove(0);
        userManager.mergeProfiles(mergeDest, matched);
        nextStep.exec(firstName, surName, phone, email, mergeDest.userName);
    }
}

 

 

Ask a question, or offer an answer